package com.macro.mall.tiny.modules.garden.controller;


import com.macro.mall.tiny.common.api.CommonResult;
import com.macro.mall.tiny.modules.garden.model.RxFile;
import com.macro.mall.tiny.modules.garden.service.RxFileService;
import com.macro.mall.tiny.security.util.SecurityUtils;
import com.macro.mall.tiny.utils.ServerIpUtils;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.Objects;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author macro
 * @since 2025-04-28
 */
@RestController
@RequestMapping("/garden/file")
public class RxFileController {


    @Autowired
    private RxFileService rxFileService;


    @Value("${image.storage-path}")
    private String imageStoragePath;

    @Value("${server.port}")
    private String port;

    @GetMapping("/image/{imageName}")
    public ResponseEntity<FileSystemResource> getImage(@PathVariable String imageName) throws IOException {
        // 防止路径遍历攻击，确保imageName是合法文件名
        if (imageName.contains("..") || imageName.contains("/")) {
            return ResponseEntity.badRequest().build();
        }

        // 构建图片文件路径
        Path imagePath = Paths.get(imageStoragePath).resolve(imageName).normalize();
        File imageFile = imagePath.toFile();

        // 检查文件是否存在
        if (!imageFile.exists() || !imageFile.isFile()) {
            return ResponseEntity.notFound().build();
        }

        // 获取MIME类型
        String mimeType = Files.probeContentType(imagePath);
        if (mimeType == null) {
            // 默认类型
            mimeType = "application/octet-stream";
        }

        // 返回图片
        FileSystemResource resource = new FileSystemResource(imageFile);
        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType(mimeType))
                .body(resource);
    }

    @PostMapping("/upload")
    @ApiOperation(value = "上传文件")
    public CommonResult<?> handleFileUpload(
            @RequestParam("file") MultipartFile file, @RequestParam(value = "path", required = false) String path) {
        System.out.println("执行上传逻辑============" + path);

        try {
            // 检查文件是否为空
            if (file.isEmpty()) {
                return CommonResult.failed("请选择要上传的文件");
            }

            // 创建上传目录（如果不存在）
            Path uploadPath = Paths.get(imageStoragePath);
            if (!Files.exists(uploadPath)) {
                Files.createDirectories(uploadPath);
            }

            // 保存文件到指定路径
            Path filePath = uploadPath.resolve(Objects.requireNonNull(file.getOriginalFilename()));
            file.transferTo(filePath.toFile());

            //插入并返回链接
            RxFile rxFile = new RxFile();
            rxFile.setCreateTime(new Date());
            rxFile.setUrl("http://" + ServerIpUtils.getServerIp() + ":" + port + "/garden/file/image/" + file.getOriginalFilename());
            rxFile.setLocalPath(path);
            rxFile.setCreator(SecurityUtils.getCurrentUserId());
            rxFileService.save(rxFile);

            // 返回成功响应
            return CommonResult.success(rxFile.getUrl());

        } catch (IOException e) {
            e.printStackTrace();
            return CommonResult.failed("文件上传失败");
        }
    }


    @GetMapping("/latest")
    public ResponseEntity<Resource> downloadLatestApk() throws UnsupportedEncodingException {
        // 构建完整的文件路径
        File apkFile = new File("D:\\uploads\\download\\latest.apk");

        // 检查文件是否存在且可读
        if (!apkFile.exists() || !apkFile.canRead()) {
            // 文件不存在或不可读，返回 404 Not Found
            // 可以在此处添加更详细的日志
            // Log.error("APK file not found or not readable: {}", apkFile.getAbsolutePath());
            return ResponseEntity.notFound().build();
        }

        // 使用 FileSystemResource 包装文件，Spring 将处理文件流
        Resource resource = new FileSystemResource(apkFile);

        // 确定文件的 MIME 类型 (对于 APK 文件是固定的)
        MediaType mediaType = MediaType.parseMediaType("application/vnd.android.package-archive");

        // 构建 Content-Disposition 头，指示客户端以下载附件的形式处理响应，并提供建议的文件名
        String encodedFileName = URLEncoder.encode(apkFile.getName(), String.valueOf(StandardCharsets.UTF_8));
        // 使用 filename* 语法更好地支持非 ASCII 文件名
        String contentDisposition = "attachment; filename=\"" + encodedFileName + "\"; filename*=utf-8''" + encodedFileName;

        // 构建并返回 ResponseEntity，包含文件内容、头信息和状态码 (200 OK)
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) // 设置下载头
                .contentType(mediaType) // 设置内容类型
                // Content-Length 头通常由 Spring 在返回 Resource 时自动设置
                // .contentLength(apkFile.length()) // 也可以手动设置文件长度
                .body(resource); // 设置响应体为文件资源 (APK 文件内容)
    }
}

